<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        
        <meta name="author" content="隐星魂 (Roy.Sun)">
        
        <link rel="shortcut icon" href="../../../img/favicon.ico">
        <title>上手指南 - 玄武操作系统</title>
        <link href="../../../css/bootstrap.min.css" rel="stylesheet">
        <link href="../../../css/font-awesome.min.css" rel="stylesheet">
        <link href="../../../css/base.css" rel="stylesheet">
        <link rel="stylesheet" href="https://cdn.staticfile.org/highlight.js/10.0.3/styles/color-brewer.min.css">

        <script src="../../../js/jquery-1.10.2.min.js" defer></script>
        <script src="../../../js/bootstrap.min.js" defer></script>
        <script src="https://cdn.staticfile.org/highlight.js/10.0.3/highlight.min.js"></script>
        <script>hljs.initHighlightingOnLoad();</script> 
    </head>

    <body>
        <div class="navbar fixed-top navbar-expand-lg navbar-dark bg-primary">
            <div class="container">
                <a class="navbar-brand" href="../../..">玄武操作系统</a>
                <!-- Expander button -->
                <button type="button" class="navbar-toggler" data-toggle="collapse" data-target="#navbar-collapse">
                    <span class="navbar-toggler-icon"></span>
                </button>

                <!-- Expanded navigation -->
                <div id="navbar-collapse" class="navbar-collapse collapse">
                        <!-- Main navigation -->
                        <ul class="nav navbar-nav">
                            <li class="navitem">
                                <a href="../../.." class="nav-link">主页</a>
                            </li>
                            <li class="navitem">
                                <a href="../../../license/" class="nav-link">开源协议</a>
                            </li>
                            <li class="dropdown active">
                                <a href="#" class="nav-link dropdown-toggle" data-toggle="dropdown">快速开发指南 <b class="caret"></b></a>
                                <ul class="dropdown-menu">
                                    
  <li class="dropdown-submenu">
    <a href="#" class="dropdown-item">STM32</a>
    <ul class="dropdown-menu">
            
<li>
    <a href="../../stm32/01-Envsetup-Guide/" class="dropdown-item">开发环境搭建指南</a>
</li>
            
<li>
    <a href="../../stm32/02-Project-Setup-Guide/" class="dropdown-item">工程配置指南</a>
</li>
            
<li>
    <a href="../../stm32/03-atkh743/" class="dropdown-item">正点原子阿波罗H743开发板上手指南</a>
</li>
            
<li>
    <a href="../../stm32/04-fk429m/" class="dropdown-item">反客F429核心板上手指南</a>
</li>
            
<li>
    <a href="../../stm32/05-atkf407core/" class="dropdown-item">正点原子F407核心板上手指南</a>
</li>
            
<li>
    <a href="../../stm32/06-atkf103core/" class="dropdown-item">正点原子F103核心板上手指南</a>
</li>
    </ul>
  </li>
                                    
  <li class="dropdown-submenu">
    <a href="#" class="dropdown-item">NXP S32K</a>
    <ul class="dropdown-menu">
            
<li>
    <a href="../../s32k/01-Envsetup-Guide/" class="dropdown-item">开发环境搭建指南</a>
</li>
            
<li>
    <a href="../../s32k/02-Project-Setup-Guide/" class="dropdown-item">工程配置指南</a>
</li>
    </ul>
  </li>
                                    
  <li class="dropdown-submenu">
    <a href="#" class="dropdown-item">玄武内核模块</a>
    <ul class="dropdown-menu">
            
<li>
    <a href="./" class="dropdown-item active">上手指南</a>
</li>
    </ul>
  </li>
                                </ul>
                            </li>
                            <li class="dropdown">
                                <a href="#" class="nav-link dropdown-toggle" data-toggle="dropdown">应用手册 <b class="caret"></b></a>
                                <ul class="dropdown-menu">
                                    
<li>
    <a href="../../../UserManual/00-index/" class="dropdown-item">00.目录</a>
</li>
                                    
<li>
    <a href="../../../UserManual/01-brief/" class="dropdown-item">01.简介</a>
</li>
                                    
<li>
    <a href="../../../UserManual/02-Basic-System-Architecture/" class="dropdown-item">02.系统基本架构</a>
</li>
                                    
<li>
    <a href="../../../UserManual/03-Build-System/" class="dropdown-item">03.构建系统</a>
</li>
                                    
<li>
    <a href="../../../UserManual/04-Boot-Flow/" class="dropdown-item">04.启动流程</a>
</li>
                                    
<li>
    <a href="../../../UserManual/05-IRQ/" class="dropdown-item">05.中断控制</a>
</li>
                                    
<li>
    <a href="../../../UserManual/06-SKD/" class="dropdown-item">06.调度器</a>
</li>
                                    
<li>
    <a href="../../../UserManual/07-Thread/" class="dropdown-item">07.线程</a>
</li>
                                    
<li>
    <a href="../../../UserManual/08-SWT/" class="dropdown-item">08.软件定时器</a>
</li>
                                    
<li>
    <a href="../../../UserManual/09-PM/" class="dropdown-item">09.电源管理</a>
</li>
                                    
<li>
    <a href="../../../UserManual/10-Lock/" class="dropdown-item">10.锁</a>
</li>
                                    
<li>
    <a href="../../../UserManual/11-Sync/" class="dropdown-item">11.同步</a>
</li>
                                    
<li>
    <a href="../../../UserManual/12-MM/" class="dropdown-item">12.内存管理</a>
</li>
                                    
<li>
    <a href="../../../UserManual/13-C-Lib/" class="dropdown-item">13.玄武C库</a>
</li>
                                </ul>
                            </li>
                            <li class="dropdown">
                                <a href="#" class="nav-link dropdown-toggle" data-toggle="dropdown">移植笔记 <b class="caret"></b></a>
                                <ul class="dropdown-menu">
                                    
<li>
    <a href="../../../PortingNote/00-index/" class="dropdown-item">目录</a>
</li>
                                    
<li>
    <a href="../../../PortingNote/01-Porting-Note/" class="dropdown-item">移植笔记</a>
</li>
                                    
  <li class="dropdown-submenu">
    <a href="#" class="dropdown-item">ARM-Cortex-M</a>
    <ul class="dropdown-menu">
            
<li>
    <a href="../../../PortingNote/ARM-Cortex-M/01-ARM-Cortex-M-Porting-Note/" class="dropdown-item">架构移植笔记</a>
</li>
            
<li>
    <a href="../../../PortingNote/ARM-Cortex-M/02-STM32-Porting-Note/" class="dropdown-item">STM32</a>
</li>
    </ul>
  </li>
                                </ul>
                            </li>
                            <li class="dropdown">
                                <a href="#" class="nav-link dropdown-toggle" data-toggle="dropdown">规范 <b class="caret"></b></a>
                                <ul class="dropdown-menu">
                                    
<li>
    <a href="../../../Specification/00-index/" class="dropdown-item">目录</a>
</li>
                                    
<li>
    <a href="../../../Specification/01-Git-Commit-Specification/" class="dropdown-item">git-commit规范</a>
</li>
                                    
<li>
    <a href="../../../Specification/02-Version-Branch-Specification/" class="dropdown-item">版本分支规范</a>
</li>
                                </ul>
                            </li>
                        </ul>

                    <ul class="nav navbar-nav ml-auto">
                        <li class="nav-item">
                            <a href="#" class="nav-link" data-toggle="modal" data-target="#mkdocs_search_modal">
                                <i class="fa fa-search"></i> 搜索
                            </a>
                        </li>
                            <li class="nav-item">
                                <a rel="prev" href="../../s32k/02-Project-Setup-Guide/" class="nav-link">
                                    <i class="fa fa-arrow-left"></i> 上一篇
                                </a>
                            </li>
                            <li class="nav-item">
                                <a rel="next" href="../../../UserManual/00-index/" class="nav-link">
                                    下一篇 <i class="fa fa-arrow-right"></i>
                                </a>
                            </li>
                    </ul>
                </div>
            </div>
        </div>

        <div class="container">
            <div class="row">
                    <div class="col-md-3"><div class="navbar-light navbar-expand-md bs-sidebar hidden-print affix" role="complementary">
    <div class="navbar-header">
        <button type="button" class="navbar-toggler collapsed" data-toggle="collapse" data-target="#toc-collapse" title="Table of Contents">
            <span class="fa fa-angle-down"></span>
        </button>
    </div>

    
    <div id="toc-collapse" class="navbar-collapse collapse card bg-secondary">
        <ul class="nav flex-column">
            
            <li class="nav-item" data-level="1"><a href="#_1" class="nav-link">玄武内核模块快速上手指南</a>
              <ul class="nav flex-column">
              </ul>
            </li>
            
            <li class="nav-item" data-level="1"><a href="#1" class="nav-link">1.安装虚拟机</a>
              <ul class="nav flex-column">
              </ul>
            </li>
            
            <li class="nav-item" data-level="1"><a href="#2linux" class="nav-link">2.在虚拟机中安装Linux</a>
              <ul class="nav flex-column">
              </ul>
            </li>
            
            <li class="nav-item" data-level="1"><a href="#3" class="nav-link">3.在虚拟机中安装编译工具</a>
              <ul class="nav flex-column">
              </ul>
            </li>
            
            <li class="nav-item" data-level="1"><a href="#4" class="nav-link">4.在虚拟机中运行玄武内核模块</a>
              <ul class="nav flex-column">
            <li class="nav-item" data-level="2"><a href="#_2" class="nav-link">下载源码</a>
              <ul class="nav flex-column">
              </ul>
            </li>
            <li class="nav-item" data-level="2"><a href="#_3" class="nav-link">编译</a>
              <ul class="nav flex-column">
              </ul>
            </li>
            <li class="nav-item" data-level="2"><a href="#_4" class="nav-link">运行</a>
              <ul class="nav flex-column">
              </ul>
            </li>
              </ul>
            </li>
            
            <li class="nav-item" data-level="1"><a href="#5" class="nav-link">5.增加演示工程</a>
              <ul class="nav flex-column">
            <li class="nav-item" data-level="2"><a href="#51hixwos" class="nav-link">5.1.建立hixwos模块</a>
              <ul class="nav flex-column">
              </ul>
            </li>
            <li class="nav-item" data-level="2"><a href="#52hixwos" class="nav-link">5.2.增加对hixwos模块的引用</a>
              <ul class="nav flex-column">
              </ul>
            </li>
            <li class="nav-item" data-level="2"><a href="#53" class="nav-link">5.3.运行</a>
              <ul class="nav flex-column">
              </ul>
            </li>
              </ul>
            </li>
        </ul>
    </div>
</div></div>
                    <div class="col-md-9" role="main">

<h1 id="_1">玄武内核模块快速上手指南</h1>
<hr />
<h1 id="1">1.安装虚拟机</h1>
<p>可选 <a href="https://www.virtualbox.org/">Virtualbox</a> 或 <a href="https://www.vmware.com/">VMWare</a> 。</p>
<h1 id="2linux">2.在虚拟机中安装Linux</h1>
<ul>
<li>只要满足内核版本范围在3.0.x ~ 5.4.x的Linux发行版都可以运行玄武内核模块，例如：<ul>
<li><a href="https://ubuntu.com/">Ubuntu</a></li>
<li><a href="https://www.deepin.org/zh">深度OS</a></li>
<li><a href="https://www.archlinux.org/">ArchLinux</a></li>
<li><a href="https://www.opensuse.org/">OpenSUSE</a></li>
<li><a href="https://www.archlinux.org/">ArchLinux</a></li>
</ul>
</li>
<li>本文提供一个配置好的Lubuntu-20.04的虚拟机文件，可以使用Virtualbox导入：<ul>
<li><a href="https://pan.baidu.com/s/1ersWkY-lr78Y5uYE0oFmvg">百度网盘</a></li>
<li>提取码：xwos</li>
<li>虚拟机用户名：xwos</li>
<li>虚拟机密码：xwos</li>
</ul>
</li>
</ul>
<h1 id="3">3.在虚拟机中安装编译工具</h1>
<h3 id="emacs">emacs</h3>
<ul>
<li>用途：执行elisp脚本</li>
<li>安装方法</li>
</ul>
<pre><code class="sh">sudo apt-add-repository ppa:kelleyk/emacs
sudo apt-get update
sudo apt install emacs27
</code></pre>

<h3 id="bash">bash</h3>
<ul>
<li>用途：执行shell脚本</li>
<li>安装方法</li>
</ul>
<pre><code class="sh">sudo dpkg-reconfigure dash # 选择“否”
</code></pre>

<h3 id="build-essential">build-essential</h3>
<ul>
<li>用途：这是一个虚包，此包会通过依赖将相关的一系列工具(make, gcc, &#x2026;)
    全部安装到系统。</li>
<li>安装方法</li>
</ul>
<pre><code class="sh">sudo apt install build-essential
</code></pre>

<h1 id="4">4.在虚拟机中运行玄武内核模块</h1>
<p>假定工作目录为 <strong>/wkspc</strong> 。</p>
<h2 id="_2">下载源码</h2>
<pre><code class="sh">cd /wkspc
git clone https://gitee.com/starsoul/XuanWuKO.git
</code></pre>

<h2 id="_3">编译</h2>
<pre><code class="sh">cd /wkspc/XuanWuKO/xwbd/pc
make
</code></pre>

<p><img alt="img" src="../res/figure/XwkoBuilding.png" title="编译过程" /></p>
<h2 id="_4">运行</h2>
<h3 id="_5">安装模块</h3>
<pre><code class="sh">cd /wkspc/XuanWuKO/xwbd/pc
sudo insmod wkspc/xwos.ko
</code></pre>

<h3 id="_6">查看玄武模块的输出</h3>
<pre><code class="sh">dmesg
</code></pre>

<p><img alt="img" src="../res/figure/XwkoRunning.png" title="运行过程" /></p>
<h3 id="_7">卸载模块</h3>
<pre><code class="sh">sudo rmmod xwos.ko
</code></pre>

<h1 id="5">5.增加演示工程</h1>
<h2 id="51hixwos">5.1.建立hixwos模块</h2>
<p>在xwam/example/目录下建立文件夹hixwos/，其中包含一个C源文件xwmo.c，
一个C头文件xwmo.h，和一个makefile文件xwmo.mk：</p>
<p><img alt="img" src="../res/figure/XwkoHixwosContent.png" title="hixwos目录结构" /></p>
<h3 id="xwmoc">xwmo.c</h3>
<pre><code class="C">#include &lt;xwos/standard.h&gt;
#include &lt;xwos/lib/xwlog.h&gt;
#include &lt;xwos/osal/scheduler.h&gt;
#include &lt;xwos/osal/thread.h&gt;
#include &lt;xwos/osal/sync/semaphore.h&gt;

#define HIXWOS_PRODUCER_PRIORITY \
        XWOSAL_SD_PRIORITY_DROP(XWOSAL_SD_PRIORITY_RT_MAX, 20) /* 生产者线程优先级*/
#define HIXWOS_CONSUMER_PRIORITY \
        XWOSAL_SD_PRIORITY_DROP(XWOSAL_SD_PRIORITY_RT_MAX, 20) /* 消费者线程优先级*/

struct xwosal_smr hixwos_smr; /**&lt; 信号量 */
xwid_t hixwos_producer_thrd_tid; /**&lt; 生产者线程id */
xwid_t hixwos_consumer_thrd_tid; /**&lt; 消费者线程id */

/**
 * @brief 日志输出函数
 */
#define hixwoslogf(lv, fmt, ...)  xwlogf(lv, &quot;hixwos&quot;, fmt, ##__VA_ARGS__)

/**
 * @brief 生产者线程
 */
xwer_t hixwos_producer_thrd(void * arg)
{
        xwid_t smrid = (xwid_t)arg;
        xwtm_t time;
        xwsq_t i;

        hixwoslogf(INFO, &quot;Hi, XuanWuOS! I'am producer.\n&quot;);
        for (i = 0; i &lt; 3; i++) { /* 循环3次 */
                time = 1 * XWTM_S;
                xwosal_cthrd_sleep(&amp;time); /* 睡眠1s钟 */
                hixwoslogf(INFO, &quot;Producer: Post once, ID:%d\n&quot;, i);
                xwosal_smr_post(smrid); /* 发送信号量 */
        }
        hixwoslogf(INFO, &quot;Producer exit.\n&quot;);
        return XWOK;
}

/**
 * @brief 消费者线程
 */
xwer_t hixwos_consumer_thrd(void * arg)
{
        xwid_t smrid = (xwid_t)arg;
        xwer_t rc;
        xwsq_t i;

        hixwoslogf(INFO, &quot;Hi, XuanWuOS! I'am consumer.\n&quot;);
        for (i = 0; i &lt; 3; i++) { /* 循环3次 */
                rc = xwosal_smr_wait(smrid); /* 等待信号量 */
                if (XWOK == rc) {
                        hixwoslogf(INFO, &quot;Consumer: Got! ID:%d\n&quot;, i);
                }
        }
        hixwoslogf(INFO, &quot;Consumer exit.\n&quot;);
        return XWOK;
}

xwer_t hixwos_start(void)
{
        xwer_t rc;
        xwer_t trc;
        xwid_t smrid;

        /* 初始化信号量 */
        rc = xwosal_smr_init(&amp;hixwos_smr, 0, XWSSQ_MAX);
        if (rc &lt; 0) {
                hixwoslogf(ERR,
                           &quot;Failed to hixwos_smr ... [rc:%d]\n&quot;,
                           rc);
                goto err_init_hixwos_smr;
        }
        smrid = xwosal_smr_get_id(&amp;hixwos_smr);

        /* 建立生产者线程 */
        rc = xwosal_thrd_create(&amp;hixwos_producer_thrd_tid,
                                &quot;hixwos_producer_thrd&quot;,
                                hixwos_producer_thrd,
                                (void *)smrid, XWOS_UNUSED_ARGUMENT,
                                HIXWOS_PRODUCER_PRIORITY,
                                XWOS_UNUSED_ARGUMENT);
        if (rc &lt; 0) {
                hixwoslogf(ERR,
                           &quot;Create hixwos_producer_thrd ... [FAILED]! rc:%d\n&quot;,
                           rc);
                goto err_create_hixwos_producer_thrd;
        }

        /* 建立消费者线程 */
        rc = xwosal_thrd_create(&amp;hixwos_consumer_thrd_tid,
                                &quot;hixwos_consumer_thrd&quot;,
                                hixwos_consumer_thrd,
                                (void *)smrid, XWOS_UNUSED_ARGUMENT,
                                HIXWOS_CONSUMER_PRIORITY,
                                XWOS_UNUSED_ARGUMENT);
        if (rc &lt; 0) {
                hixwoslogf(ERR,
                           &quot;Create hixwos_consumer_thrd ... [FAILED]! rc:%d\n&quot;,
                           rc);
                goto err_create_hixwos_consumer_thrd;
        }

        return XWOK;

err_create_hixwos_consumer_thrd:
        xwosal_thrd_terminate(hixwos_producer_thrd_tid, &amp;trc);
        xwosal_thrd_delete(hixwos_producer_thrd_tid);
err_create_hixwos_producer_thrd:
        xwosal_smr_destroy(&amp;hixwos_smr);
err_init_hixwos_smr:
        return rc;
}

void hixwos_stop(void)
{
        xwer_t trc;

        /* 销毁消费者线程 */
        xwosal_thrd_terminate(hixwos_consumer_thrd_tid, &amp;trc);
        xwosal_thrd_delete(hixwos_consumer_thrd_tid);

        /* 销毁生产者线程 */
        xwosal_thrd_terminate(hixwos_producer_thrd_tid, &amp;trc);
        xwosal_thrd_delete(hixwos_producer_thrd_tid);

        /* 销毁信号量 */
        xwosal_smr_destroy(&amp;hixwos_smr);
}

xwer_t hixwos_init(void)
{
        return hixwos_start();
}

void hixwos_exit(void)
{
        hixwos_stop();
}
</code></pre>

<h3 id="xwmoh">xwmo.h</h3>
<pre><code class="C">#ifndef __xwam_example_hixwos_xwmo_h__
#define __xwam_example_hixwos_xwmo_h__

#include &lt;xwos/standard.h&gt;

xwer_t hixwos_init(void);
void hixwos_exit(void);

#endif /* xwam/example/hixwos/xwmo.h */
</code></pre>

<h3 id="xwmomk">xwmo.mk</h3>
<pre><code class="makefile">XWMO_INCDIRS :=
XWMO_ESRCS :=
XWMO_CSRCS += xwmo.c
</code></pre>

<h2 id="52hixwos">5.2.增加对hixwos模块的引用</h2>
<h3 id="_8">增加编译开关</h3>
<p>在<code>xwbd/pc/cfg/xwam.h</code>中增加：</p>
<pre><code class="C">#define XWAMCFG_example_hixwos      1
</code></pre>

<h3 id="hixwosinit">在初始化流程中调用hixwos模块的init函数</h3>
<p>在xwbd/pc/bdl/board.c中增加</p>
<pre><code class="C">xwer_t board_example_init(void)
{
        xwer_t rc;

        rc = XWOK;
#if defined(XWAMCFG_example_hixwos) &amp;&amp; (1 == XWAMCFG_example_hixwos)
        rc = hixwos_init();
        if (rc &lt; 0) {
                xwbdlogf(ERR, &quot;Init example hixwos ... [FAILED], rc:%d\n&quot;,
                         rc);
                goto err_hixwos_init;
        }
        xwbdlogf(INFO, &quot;Init example hixwos ... [OK]\n&quot;);
#endif /* XWAMCFG_example_hixwos */

        return XWOK;

#if defined(XWAMCFG_example_hixwos) &amp;&amp; (1 == XWAMCFG_example_hixwos)
err_hixwos_init:
#endif /* XWAMCFG_example_hixwos */
        return rc;
}

xwer_t board_example_exit(void)
{
#if defined(XWAMCFG_example_hixwos) &amp;&amp; (1 == XWAMCFG_example_hixwos)
        hixwos_exit();
#endif /* XWAMCFG_example_hixwos */
}
</code></pre>

<h2 id="53">5.3.运行</h2>
<h3 id="_9">安装模块</h3>
<pre><code class="sh">cd /wkspc/XuanWuKO/xwbd/pc
sudo insmod wkspc/xwos.ko
</code></pre>

<h3 id="_10">查看玄武模块的输出</h3>
<pre><code class="sh">dmesg
</code></pre>

<p>此演示模块中创建了两个线程，Producer线程与Consumer线程，从log中可以看到
两个线程通过信号量进行同步，3秒钟后纷纷退出。</p>
<p><img alt="img" src="../res/figure/XwkoRunning.png" title="运行过程" /></p></div>
            </div>
        </div>

        <footer class="col-md-12">
            <hr>
            <p>Documentation built with <a href="https://www.mkdocs.org/">MkDocs</a>.</p>
        </footer>
        <script>
            var base_url = "../../..",
                shortcuts = {"help": 191, "next": 78, "previous": 80, "search": 83};
        </script>
        <script src="../../../js/base.js" defer></script>
        <script src="../../../search/main.js" defer></script>

        <div class="modal" id="mkdocs_search_modal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel" aria-hidden="true">
    <div class="modal-dialog modal-lg">
        <div class="modal-content">
            <div class="modal-header">
                <h4 class="modal-title" id="searchModalLabel">搜索</h4>
                <button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>
            </div>
            <div class="modal-body">
                <p>
                    在这里所有文档：
                </p>
                <form>
                    <div class="form-group">
                        <input type="search" class="form-control" placeholder="搜索..." id="mkdocs-search-query" title="Type search term here">
                    </div>
                </form>
                <div id="mkdocs-search-results"></div>
            </div>
            <div class="modal-footer">
            </div>
        </div>
    </div>
</div><div class="modal" id="mkdocs_keyboard_modal" tabindex="-1" role="dialog" aria-labelledby="keyboardModalLabel" aria-hidden="true">
    <div class="modal-dialog">
        <div class="modal-content">
            <div class="modal-header">
                <h4 class="modal-title" id="keyboardModalLabel">Keyboard Shortcuts</h4>
                <button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>
            </div>
            <div class="modal-body">
              <table class="table">
                <thead>
                  <tr>
                    <th style="width: 20%;">Keys</th>
                    <th>Action</th>
                  </tr>
                </thead>
                <tbody>
                  <tr>
                    <td class="help shortcut"><kbd>?</kbd></td>
                    <td>Open this help</td>
                  </tr>
                  <tr>
                    <td class="next shortcut"><kbd>n</kbd></td>
                    <td>Next page</td>
                  </tr>
                  <tr>
                    <td class="prev shortcut"><kbd>p</kbd></td>
                    <td>Previous page</td>
                  </tr>
                  <tr>
                    <td class="search shortcut"><kbd>s</kbd></td>
                    <td>Search</td>
                  </tr>
                </tbody>
              </table>
            </div>
            <div class="modal-footer">
            </div>
        </div>
    </div>
</div>

    </body>
</html>
